#ifndef IO_BMP_H_
#define IO_BMP_H_

#include <fstream>
#include <vector>
#include <string>
#include <stdexcept>

class Texels;

class IObmp {
   private:
      std::ifstream archivo;

      int posicionMapa;

      int ancho;
      int alto;

      char buffer[4];

      void leerInt(int &i);
      void leerShort(int &i);

      IObmp(const IObmp &aCopiar);
      IObmp& operator=(const IObmp &aCopiar);

      void procesarCabeceraBMP();
      void procesarCabeceraDIB();
      std::vector<unsigned char>& procesarMapaRGB();
      std::vector<unsigned char>& procesarBMP();


      /*
       * Procesa el archivo, obteniendo un vector con el mapa de bits del BMP.
       *
       * Se encarga de cerrar ordenadamente el archivo tanto en el caso de una
       * finalizacion correcta como en el caso de que surja una excepcion.
       * */
      std::vector<unsigned char>& procesarArchivoRGB(const std::string &nombre);


   public:
      class Excepcion : public std::runtime_error {
         public:
            Excepcion(const std::string &quePaso) throw();
            virtual ~Excepcion() throw();
      };

      class FormatoNoImplementado : public IObmp::Excepcion {
         public:
            FormatoNoImplementado(const std::string &quePaso) throw();
            virtual ~FormatoNoImplementado() throw();
      };

      IObmp();

      Texels& cargarBMP(const std::string &nombre);
};

#endif
